/**
 * 
 */
package domain;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Observable;

import vista.ventanas.PanelPizarra;
import business.JuegoObserver;
import domain.trazos.TrazoNormal;

/**
 * @author De La
 *
 */
public class Juego extends Observable {
	
	private static Juego instance;
	
	private ArrayList<Jugador> jugadores;
	private Jugador jugadorEnTurno;
	
	private Pizarra pizarra;
	private ArrayList<Papa> papas;
	private ArrayList<Numero> numeros;
	
	/**
	 * 
	 *
	 */
	private Juego() { 
		addObserver( new JuegoObserver() );
		setPizarra( new Pizarra() );
		setPapas( new ArrayList<Papa>() );
		setNumeros( new ArrayList<Numero>() );
		setChanged();
		notifyObservers();
	}
	
	/**
	 * 
	 *
	 */
	private static synchronized void createInstance() {
		if ( instance == null ) {
			instance = new Juego();
		}
	}
	
	/**
	 * 
	 * @return
	 */
	public static Juego getInstance()  {
		if ( instance == null ) {
			createInstance();
		}
		return instance;
	}
	
	/**
	 * 
	 * @param mousePosition
	 * @param nuevoTrazo
	 */
	public void addPunto(Point mousePosition, Boolean nuevoTrazo) {
		Point puntoChoque = null;
		if ( !nuevoTrazo ) {
			puntoChoque = getPizarra().addPunto(mousePosition, new TrazoNormal()); //TODO tipo de trazo
		}
		
		//Verifico si hubo un choque:
		if (puntoChoque != null) {
			getPizarra().setUltimoPunto( puntoChoque );
			getPapas().add( new Papa( puntoChoque, Papa.RADIO_NORMAL ) );
			
			setChanged();
			notifyObservers();
			
			addPunto(mousePosition, false);
		}

		getPizarra().setUltimoPunto( mousePosition );
	}
	
	/**
	 * Elimino todos los objetos visuales
	 * obligando q se vuelvan a crear
	 * Limpio la pizarra
	 * Elimino todas las papas
	 *
	 */
	public void limpiar() {
		getPizarra().deleteObservers();
		getPizarra().limpiar();
		for ( Papa papa : getPapas() ) {
			papa.deleteObservers();
		}
		getPapas().clear();
		PanelPizarra.getInstance().removeAll();
		
		setChanged();
		notifyObservers();
	}

	/**
	 * @return the jugadorEnTurno
	 */
	public Jugador getJugadorEnTurno() {
		return jugadorEnTurno;
	}

	/**
	 * @param jugadorEnTurno the jugadorEnTurno to set
	 */
	public void setJugadorEnTurno(Jugador jugadorEnTurno) {
		this.jugadorEnTurno = jugadorEnTurno;
	}

	/**
	 * @return the jugadores
	 */
	public ArrayList<Jugador> getJugadores() {
		return jugadores;
	}

	/**
	 * @param jugadores the jugadores to set
	 */
	public void setJugadores(ArrayList<Jugador> jugadores) {
		this.jugadores = jugadores;
	}

	/**
	 * @return the numeros
	 */
	public ArrayList<Numero> getNumeros() {
		return numeros;
	}

	/**
	 * @param numeros the numeros to set
	 */
	public void setNumeros(ArrayList<Numero> numeros) {
		this.numeros = numeros;
	}

	/**
	 * @return the papas
	 */
	public ArrayList<Papa> getPapas() {
		return papas;
	}

	/**
	 * @param papas the papas to set
	 */
	public void setPapas(ArrayList<Papa> papas) {
		this.papas = papas;
	}

	/**
	 * @return the pizarra
	 */
	public Pizarra getPizarra() {
		return pizarra;
	}

	/**
	 * @param pizarra the pizarra to set
	 */
	public void setPizarra(Pizarra pizarra) {
		this.pizarra = pizarra;
	}
}
